package es.wtestgen.action.profesor;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionRedirect;

import es.wtestgen.action.WTestGenAction;
import es.wtestgen.bean.profesor.PreguntaForm;
import es.wtestgen.domain.Asignatura;
import es.wtestgen.domain.Pregunta;
import es.wtestgen.domain.Profesor;
import es.wtestgen.domain.Respuesta;
import es.wtestgen.services.AsignaturaDAO;
import es.wtestgen.services.PreguntaDAO;
import es.wtestgen.services.RespuestaDAO;
import es.wtestgen.util.Constantes;

public class MantenimientoPreguntasAction extends WTestGenAction {

	private static final Log log = LogFactory.getLog(MantenimientoPreguntasAction.class);

	@Override
	public ActionForward _execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)  {

		log.info("_________Estamos en MantenimientoPreguntasAction, donde se gestionan los tramites acerca de las Preguntas de las asignaturas");	
		
		String accion = request.getParameter("accion");
		
		ActionForward forward = null;
		
		/*
		 *	Cargamos en sesion los niveles de dificultad para las preguntas 
		 */
		request.getSession().setAttribute("dificultades", Constantes.dificultades);
		
		if(accion == null || accion.equals("")){
			forward = seleccionarAsignaturaPreguntas(mapping, form, request, response);
		}else if(accion.equals("listar")){
			forward = listar(mapping, form, request, response);			
		}else if(accion.equals("nuevo")){
			forward = nuevo(mapping, form, request, response);
		}else if(accion.equals("eliminar")){
			forward = eliminar(mapping, form, request, response);
		}else if(accion.equals("editar")){
			forward = editar(mapping, form, request, response);
		}else if(accion.equals("guardar")){
			forward = guardar(mapping, form, request, response);
		}else if(accion.equals("anadirRespuestaAPregunta")){
			forward = anadirRespuestaAPregunta(mapping, form, request, response);			
		}else if(accion.equals("eliminarRespuestaAPregunta")){
			forward = eliminarRespuestaAPregunta(mapping, form, request, response);			
		}else if(accion.equals("buscar")){
			forward = buscar(mapping,form,request,response);
		}else if(accion.equals("buscarPregunta")){
			forward = buscarPregunta(mapping,form,request,response);
		}else if(accion.equals("listarPreguntasAsignatura")){
			forward = listarPreguntasAsignatura(mapping,form,request,response);			
		}

		return forward;
	}
	
	
	private ActionForward listarPreguntasAsignatura(ActionMapping mapping,
			ActionForm form, HttpServletRequest request,
			HttpServletResponse response) {
		
		PreguntaForm preguntaForm = (PreguntaForm)form;
		
		PreguntaDAO preguntaDao = new PreguntaDAO();
		
		AsignaturaDAO asignaturaDao = new AsignaturaDAO();
		
		Asignatura asignatura = new Asignatura();
		
		if(preguntaForm.getCodAsig() <= 0){
			String codAsig = (String)request.getParameter("codAsig");
			if(codAsig != null){
				preguntaForm.setCodAsig(new Integer(codAsig).intValue());				
			}else{
				asignatura = (Asignatura)request.getSession().getAttribute("asignatura");
				preguntaForm.setCodAsig(asignatura.getCodAsig());
			}
		}
		
		asignatura = (Asignatura)asignaturaDao.findById(String.valueOf(preguntaForm.getCodAsig())).get(0);
		
		List<Pregunta> listaPreguntas = preguntaDao.findPreguntasAsignatura(asignatura);
		
		if(listaPreguntas != null && listaPreguntas.size()>0){
			preguntaForm.setPreguntas(listaPreguntas);
		}else{
			preguntaForm.setPreguntas(new ArrayList<Pregunta>());
		}
		request.setAttribute("preguntas", preguntaForm.getPreguntas());
		request.getSession().setAttribute("asignatura", asignatura);
		return mapping.findForward("listarPreguntas");
	}


	private ActionForward seleccionarAsignaturaPreguntas(ActionMapping mapping,
			ActionForm form, HttpServletRequest request,
			HttpServletResponse response) {
		
		PreguntaForm preguntaForm = (PreguntaForm)form;
		
		PreguntaDAO preguntaDao = new PreguntaDAO();		
		AsignaturaDAO asignaturaDao = new AsignaturaDAO();
		
		List<Pregunta>listaPreguntas = preguntaDao.findAll();
		
		if(listaPreguntas != null && listaPreguntas.size()>0){
			preguntaForm.setPreguntas(listaPreguntas);
		}else{
			preguntaForm.setPreguntas(new ArrayList<Pregunta>());
		}
		
		
		Profesor profesor = (Profesor)request.getSession().getAttribute("usuario");
		
		List<Asignatura> asignaturas = asignaturaDao.findAsignaturasProfesor(profesor);
		
		if(asignaturas != null && asignaturas.size()>0){
			preguntaForm.setAsignaturas(asignaturas);
		}else{
			preguntaForm.setAsignaturas(new ArrayList<Asignatura>());
		}
		request.setAttribute("asignaturas", preguntaForm.getAsignaturas());
		return mapping.findForward("seleccionarAsignaturaPreguntas");
	}


	private ActionForward buscarPregunta(ActionMapping mapping,
			ActionForm form, HttpServletRequest request,
			HttpServletResponse response) {

		PreguntaForm preguntaForm = (PreguntaForm)form;
		
		PreguntaDAO preguntaDao = new PreguntaDAO();
		
		List<Pregunta> preguntas = preguntaDao.findByParameters(preguntaForm);
		
		if(preguntas != null && preguntas.size()>0){
			preguntaForm.setPreguntas(preguntas);
		}else{
			preguntaForm.setPreguntas(new ArrayList<Pregunta>());
		}
		request.setAttribute("preguntas", preguntaForm.getPreguntas());
		
		return mapping.findForward("buscarPregunta");
		
	}


	private ActionForward buscar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		
		/*
		 * Para recuperar las asignaturas del profesor en la jsp para rellenar el select
		 */
		Profesor profesor = (Profesor)request.getSession().getAttribute("usuario");
		
		PreguntaForm preguntaForm = (PreguntaForm) form;
		
		AsignaturaDAO asignaturaDao = new AsignaturaDAO();
		
		List<Asignatura>asignaturas = new ArrayList<Asignatura>();
		
		asignaturas = asignaturaDao.findAsignaturasProfesor(profesor);
		
		request.getSession().setAttribute("asignaturas", asignaturas);
		
		return mapping.findForward("buscarPregunta");
	}


	private ActionForward eliminarRespuestaAPregunta(ActionMapping mapping,
			ActionForm form, HttpServletRequest request,
			HttpServletResponse response) {
		
		PreguntaForm preguntaForm = (PreguntaForm) form;
		
		String codResp = (String)request.getParameter("codResp");
		
		Set<Respuesta> respuestasEnSesion = (Set)request.getSession().getAttribute("respuestasEnSesion");
		Set<Respuesta> respuestasEliminadasEnSesion = (Set)request.getSession().getAttribute("respuestasEliminadasEnSesion");
		
		if(respuestasEliminadasEnSesion == null){
			respuestasEliminadasEnSesion = new HashSet<Respuesta>();
		}
		
		for (Iterator iterator = respuestasEnSesion.iterator(); iterator
				.hasNext();) {
			Respuesta r = (Respuesta) iterator.next();
	
			if(String.valueOf(r.getCodResp()).equals(codResp)){
				iterator.remove();
				respuestasEliminadasEnSesion.add(r);
			}			
		}
		
		preguntaForm.setRespuestas(respuestasEnSesion);
		
		request.getSession().setAttribute("respuestasEnSesion", respuestasEnSesion);		
		request.getSession().setAttribute("respuestasEliminadasEnSesion", respuestasEliminadasEnSesion);		
		request.setAttribute("preguntaForm", preguntaForm);
		
		return editarRespuestasDePregunta(mapping, preguntaForm, request, response);
	}


	private ActionForward anadirRespuestaAPregunta(ActionMapping mapping,
			ActionForm form, HttpServletRequest request,
			HttpServletResponse response) {
		
		PreguntaForm preguntaForm = (PreguntaForm) form;
		
		String respuestaResp = "";
		boolean correcta = false;		

		respuestaResp = preguntaForm.getRespuestaRespEnPregunta();
		correcta = preguntaForm.isEsCorrectaEnPregunta();
		Respuesta respuesta = new Respuesta();
		respuesta.setEsCorrecta(correcta);
		respuesta.setRespuestaResp(respuestaResp);

		/*
		 * Anadimos provisionalmete un codigo de respuesta para poder eliminar el registro del conjunto
		 * almacenado en sesion antes de guardar la pregunta en si
		 */
		respuesta.setCodResp(new Random().nextInt());
		
		Set<Respuesta> respuestasEnSesion = (Set)request.getSession().getAttribute("respuestasEnSesion");
		respuestasEnSesion.add(respuesta);
		request.getSession().setAttribute("respuestasEnSesion", respuestasEnSesion);		
		preguntaForm.setRespuestas(respuestasEnSesion);
		
		/*
		 * Con esta clase que hereda de ActionForward le podemos añadir parametros a las
		 * redirecciones forward 
		 */
		Profesor profesor = (Profesor)request.getSession().getAttribute("usuario");
		List<Asignatura>asignaturas = new ArrayList<Asignatura>();
		AsignaturaDAO asignaturaDao = new AsignaturaDAO();
		asignaturas = asignaturaDao.findAsignaturasProfesor(profesor);
		request.getSession().setAttribute("asignaturas", asignaturas);
		
		request.setAttribute("preguntaForm", preguntaForm);
		return mapping.findForward("nuevoPregunta");
	}


	public ActionForward nuevo(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			 {
		/*
		 * Para recuperar las asignaturas del profesor en la jsp para rellenar el select
		 */
		Profesor profesor = (Profesor)request.getSession().getAttribute("usuario");
		
		PreguntaForm preguntaForm = (PreguntaForm) form;
		
		AsignaturaDAO asignaturaDao = new AsignaturaDAO();
		
		List<Asignatura>asignaturas = new ArrayList<Asignatura>();
				
		asignaturas = asignaturaDao.findAsignaturasProfesor(profesor);
		
		Set<Respuesta> respuestasEnSesion = new HashSet<Respuesta>(preguntaForm.getRespuestas());
			
		preguntaForm.setRespuestas(respuestasEnSesion);
		
		request.getSession().setAttribute("asignaturas", asignaturas);
		request.getSession().setAttribute("respuestasEnSesion", respuestasEnSesion);
		request.setAttribute("pregunta", preguntaForm);
		
		return mapping.findForward("nuevoPregunta");
	}

	public ActionForward eliminar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
	{
		PreguntaForm preguntaForm = (PreguntaForm) form;
		
		PreguntaDAO preguntaDao = new PreguntaDAO();		
		
		String codPreg = request.getParameter("codPreg");
		
		/*
		 * Con esta clase que hereda de ActionForward le podemos añadir parametros a las
		 * redirecciones forward
		 */
		ActionRedirect actionRedirect = null;
		
		if(preguntaDao.eliminar(Integer.parseInt(codPreg))){
			ActionForward findForward = mapping.findForward("eliminadoPregunta");
			actionRedirect = new ActionRedirect(findForward);
			
			Asignatura asignatura = (Asignatura)request.getSession().getAttribute("asignatura");
			
			request.getSession().setAttribute("asignatura",asignatura);
			actionRedirect.addParameter("accion", "listarPreguntasAsignatura");				
			actionRedirect.addParameter("accion", "listar");

			
			
			actionRedirect.addParameter("eliminadoOk", "si");
			return actionRedirect;			
		}else{
			return mapping.findForward("error");
		}
	}
	
	public ActionForward editar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
	{	
		/*
		 * Para recuperar las asignaturas del profesor en la jsp para rellenar el select
		 */
		Profesor profesor = (Profesor)request.getSession().getAttribute("usuario");
		
		PreguntaForm preguntaForm = (PreguntaForm) form;
		
		PreguntaDAO preguntaDao = new PreguntaDAO();
		
		Pregunta pregunta = new Pregunta();
		
		List<Asignatura>asignaturas = new ArrayList<Asignatura>();
		
		String codPreg = request.getParameter("codPreg");		
		
		if(codPreg == null || "".equals(codPreg)){
			codPreg = preguntaForm.getCodPreg();
		}
		
		List<Pregunta> preguntas = preguntaDao.findById(codPreg);
		
		pregunta = preguntas.get(0);
		
		AsignaturaDAO asignaturaDao = new AsignaturaDAO();
		asignaturas = asignaturaDao.findAsignaturasProfesor(profesor);
		request.setAttribute("asignaturas", asignaturas);
		
		Set<Respuesta> respuestasEnSesion = new HashSet<Respuesta>(pregunta.getRespuestas());		
		
		preguntaForm.setCodPreg(String.valueOf(pregunta.getCodPreg()));
		preguntaForm.setEnunciadoPreg(pregunta.getEnunciadoPreg());
		preguntaForm.setDificultad(pregunta.getDificultad());
		preguntaForm.setRespuestas(pregunta.getRespuestas());
		
		if(pregunta.getAsignatura().getCodAsig() <= 0){
			preguntaForm.setCodAsig(Integer.parseInt((String)request.getAttribute("codAsig")));			
		}else{
			preguntaForm.setCodAsig(pregunta.getAsignatura().getCodAsig());		
		}
				
		request.getSession().setAttribute("respuestasEnSesion", respuestasEnSesion);
		request.setAttribute("preguntaForm", preguntaForm);
		
		return mapping.findForward("nuevoPregunta");
	}
	
	public ActionForward guardar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
	{
		PreguntaForm preguntaForm = (PreguntaForm) form;
		
		PreguntaDAO preguntaDao = new PreguntaDAO();
		AsignaturaDAO asignaturaDao = new AsignaturaDAO();
		
		Pregunta pregunta = new Pregunta();
		
		int codAsig = preguntaForm.getCodAsig();		
		
		/*
		 * Recuperamos el conjunto de respuestas asociadas a la pregunta
		 */
		Set<Respuesta> respuestasEnSesion = (Set)request.getSession().getAttribute("respuestasEnSesion");
		Set<Respuesta> respuestasEliminadasEnSesion = (Set)request.getSession().getAttribute("respuestasEliminadasEnSesion");

		/*
		 * Obligamos que como minimo se tengan 2 respuestas asociadas a cada pregunta
		 * y solo 1 correcta por pregunta
		 */
		int numCorrectas = 0;
		if(respuestasEnSesion != null && respuestasEnSesion.size() >= 2){
			boolean algunaCorrecta = false;
			for (Iterator iterator = respuestasEnSesion.iterator(); iterator
					.hasNext();) {
				Respuesta r = (Respuesta) iterator.next();
				if(r.isEsCorrecta()){
					algunaCorrecta = true;
					numCorrectas++;
				}
			}
			if(algunaCorrecta == false){
				return mapping.findForward("errorNingunaRespuestaCorrecta");
			}
			if(numCorrectas > 1){
				return mapping.findForward("errorMasDeUnaCorrecta");				
			}
		}else{	//no tiene respuestas o no tiene 2 como minimo
			return mapping.findForward("errorNingunaRespuestaCorrecta");			
		}
		
		/*
		 *	Eliminamos de base de datos las respuestas que estaban y ahora no están asociadas a la pregunta 
		 */
		if(respuestasEliminadasEnSesion != null && respuestasEliminadasEnSesion.size() > 0){
			for (Iterator iterator = respuestasEliminadasEnSesion.iterator(); iterator
					.hasNext();) {
				Respuesta r = (Respuesta) iterator.next();
				RespuestaDAO respuestaDao = new RespuestaDAO();
				List<Respuesta> respuestas = respuestaDao.findById(String.valueOf(r.getCodResp()));
				if(respuestas != null && respuestas.size()>0){
					if(!respuestaDao.eliminar(r.getCodResp())){
						return mapping.findForward("errorEliminandoRespuestaEnPregunta");
					}					
				}
			}
		}
		
		pregunta.setEnunciadoPreg(preguntaForm.getEnunciadoPreg());
		pregunta.setDificultad(preguntaForm.getDificultad());
		if(preguntaForm.getCodPreg() != null && !preguntaForm.getCodPreg().equals("") && !preguntaForm.getCodPreg().equals("0")){
			int id = Integer.parseInt(preguntaForm.getCodPreg());
			pregunta.setCodPreg(id);
		}else{
			pregunta.setCodPreg(-1);
		}
		
		/*
		 * Obtenemos la asignatura
		 */
		Asignatura asignatura = new Asignatura();
		List<Asignatura> asignaturas = asignaturaDao.findById(String.valueOf(preguntaForm.getCodAsig()));
		if(asignaturas != null && asignaturas.size() > 0){
			asignatura = (Asignatura)asignaturas.get(0);
			pregunta.setAsignatura(asignatura);
		}
		
		ActionRedirect actionRedirect = null;
		
		if(preguntaDao.guardarPreguntaEnAsignaturaConRespuestas(pregunta,codAsig,respuestasEnSesion)){
			
			request.getSession().setAttribute("tieneCorrecta", false);			
			request.getSession().setAttribute("respuestasEliminadasEnSesion", new HashSet<Respuesta>());
			request.getSession().setAttribute("respuestasEnSesion", new HashSet<Respuesta>());
			
			ActionForward findForward = mapping.findForward("guardadoPregunta");
			actionRedirect = new ActionRedirect(findForward);
			
			//Asignatura asignatura = (Asignatura)request.getSession().getAttribute("asignatura");
			//if(asignatura != null && asignatura.getCodAsig() > 0){
				request.getSession().setAttribute("asignatura",asignatura);
				actionRedirect.addParameter("accion", "listarPreguntasAsignatura");				
			//}else{
				actionRedirect.addParameter("accion", "listar");
				actionRedirect.addParameter("guardadoOk", "si");
			//}	
			
			return actionRedirect;			
		}else{
			request.getSession().setAttribute("respuestasEliminadasEnSesion", new HashSet<Respuesta>());
			request.getSession().setAttribute("respuestasEnSesion", new HashSet<Respuesta>());
			
			return mapping.findForward("error");
		}
		
	}

	public ActionForward listar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response){
		
		PreguntaForm preguntaForm = (PreguntaForm)form;
		
		PreguntaDAO preguntaDao = new PreguntaDAO();
		
		List<Pregunta>listaPreguntas = preguntaDao.findAll();
		
		if(listaPreguntas != null && listaPreguntas.size()>0){
			preguntaForm.setPreguntas(listaPreguntas);
		}else{
			preguntaForm.setPreguntas(new ArrayList<Pregunta>());
		}
		request.setAttribute("preguntas", preguntaForm.getPreguntas());
		return mapping.findForward("listarTodasPreguntas");
	}
	
	
	/**
	 * Metodo que edita las respuestas asociadas a la pregunta que se esta modificando
	 */
	
	public ActionForward editarRespuestasDePregunta(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
	{	
		/*
		 * Para recuperar las asignaturas del profesor en la jsp para rellenar el select
		 */
		Profesor profesor = (Profesor)request.getSession().getAttribute("usuario");
		
		PreguntaForm preguntaForm = (PreguntaForm) form;
		
		Set<Respuesta> respuestasEnSesion = (Set)request.getSession().getAttribute("respuestasEnSesion");
		
		PreguntaDAO preguntaDao = new PreguntaDAO();
		AsignaturaDAO asignaturaDao = new AsignaturaDAO();
		
		Pregunta pregunta = new Pregunta();	
		
		List<Asignatura>asignaturas = new ArrayList<Asignatura>();
		
		String codPreg = request.getParameter("codPreg");
		
		if(codPreg == null || "".equals(codPreg)){
			codPreg = preguntaForm.getCodPreg();
		}
		
		if(codPreg != null && !"".equals(codPreg)){
			List<Pregunta> preguntas = preguntaDao.findById(codPreg);
			pregunta = preguntas.get(0);
			
			preguntaForm.setCodPreg(String.valueOf(pregunta.getCodPreg()));
			preguntaForm.setEnunciadoPreg(pregunta.getEnunciadoPreg());
			preguntaForm.setDificultad(pregunta.getDificultad());
			
			if(pregunta.getAsignatura().getCodAsig() <= 0){
				preguntaForm.setCodAsig(Integer.parseInt((String)request.getAttribute("codAsig")));			
			}else{
				preguntaForm.setCodAsig(pregunta.getAsignatura().getCodAsig());		
			}
		}
		
		asignaturas = asignaturaDao.findAsignaturasProfesor(profesor);
		
		preguntaForm.setRespuestas(respuestasEnSesion);
		
		request.setAttribute("asignaturas", asignaturas);
		request.getSession().setAttribute("respuestasEnSesion", preguntaForm.getRespuestas());
		request.setAttribute("preguntaForm", preguntaForm);
		
		return mapping.findForward("nuevoPregunta");
	}
	
	

}
